#include "GraphicsBaseItemData.h"
#include <GraphicsBaseItem.h>
#include <GraphicsUtil.h>
#include <QDebug>

GraphicsBaseItemData::GraphicsBaseItemData(BaseItemType type, GraphicsBaseItem* parent)
	:m_baseItemType(type)
	, m_parentItem(parent)
{
	m_borderColor = GraphicsUtil::getBorderColor(GraphicsUtil::Cyan_Enum);
}

void GraphicsBaseItemData::saveContext()
{
	m_context = getItemInfo();
	for (GraphicsBaseItem* child : getChilds()) {
		child->getItemData().saveContext();
	}
}

GraphicsBaseItemData::BaseItemInfo GraphicsBaseItemData::getItemInfo()const
{
	BaseItemInfo info;
	info.pos = getCurPos();
	info.scale = getItemScale();
	info.rect = getScaleRect();
	info.angle = getRotateAngle();
	return info;
}

QMap<GraphicsBaseItem*, GraphicsBaseItemData::BaseItemInfo> GraphicsBaseItemData::getChildsInfoMap() const
{
	QMap<GraphicsBaseItem*, GraphicsItemInfo> curChildsInfoMap;
	for (GraphicsBaseItem* child : getChilds()) {
		curChildsInfoMap[child] = child->getItemData().getItemInfo();
	}
	return curChildsInfoMap;
}

void GraphicsBaseItemData::savePressContext()
{
	GraphicsItemInfo pressItemInfo = getItemInfo();
	setPressItemInfo(pressItemInfo);
	for (GraphicsBaseItem* child : getChilds()) {
		child->getItemData().savePressContext();
	}
}

void GraphicsBaseItemData::setRealSize(const QSizeF& size)
{
	m_boundingRect.setSize(size);
	emit sigSizeChanged();
}

void GraphicsBaseItemData::setScaleSize(const QSizeF& scaleSize)
{
	const qreal scale = getItemScale();
	const QSizeF realSize = scaleSize / scale;
	setRealSize(realSize);
}

QSizeF GraphicsBaseItemData::getScaleSize() const
{
	return getScaleRect().size();
}

void GraphicsBaseItemData::setItemScale(qreal scale)
{
	m_scale = scale;
	// 发出通知
	emit sigItemScaleChanged(scale);
}

void GraphicsBaseItemData::addChild(GraphicsBaseItem* child)
{
	m_childs.append(child);
}

void GraphicsBaseItemData::setRotateAngle(qreal angle, bool sendSignal)
{
	m_rotateAngle = angle;
	if (sendSignal) {
		emit sigRotateAngleChanged(angle);
	}
}

void GraphicsBaseItemData::setCurPos(const QPointF& pos, bool isSendChanged)
{
	m_curPos = pos;
	if (isSendChanged) {
		emit sigPositionChanged(m_curPos);
	}
}

QRectF GraphicsBaseItemData::getRect(bool isScale) const
{
	QRectF rect;
	rect.setTopLeft(m_curPos);
	if (isScale) {
		const QSizeF scaleSize = getRealSize() * getItemScale();
		if (IsOriginOnCenter()) {
			rect.setTopLeft(m_curPos - QPointF(scaleSize.width() / 2, scaleSize.height() / 2));
		}
		rect.setSize(scaleSize);
	}
	else {
		const QSizeF size = getRealSize();
		if (IsOriginOnCenter()) {
			rect.setTopLeft(m_curPos / getItemScale() - QPointF(size.width() / 2, size.height() / 2));
		}
		rect.setSize(size);
	}
	return rect;
}

QRectF GraphicsBaseItemData::getScaleRect() const
{
	return getRect();
}

QRectF GraphicsBaseItemData::getRealRect() const
{
	return getRect(false);
}


void GraphicsBaseItemData::setItemMode(GraphicsBaseItemData::BaseItemMode mode, qreal fixRatio)
{
	setExpandMode(mode);
	setFixRatio(fixRatio);
}

void GraphicsBaseItemData::setMaskImage(const QImage& mask)
{
	m_maskImage = mask;
	emit sigMaskChanged();
}
